#include <iostream>
#include <signal.h>
#include "../comm/httplib.h"
#include "oj_control.hpp"

using namespace httplib;
using namespace ns_control;

static Control* ctrl_ptr = nullptr;

void Recovery(int signo)
{
    //注册一个方法,每当ctrl+\时，就尝试上线所有机器
    LOG(INFO) << "尝试上线主机成功！" << std::endl;
    ctrl_ptr->RecoverMachine();
}

int main()
{
    signal(SIGQUIT,Recovery); 

    //用户请求的服务路由功能
    Control ctrl;
    ctrl_ptr = &ctrl;
    Server svr;
    /* 
       用户可能的请求：
       1.获取所有题目列表(首页)
       2.根据题目编号获取题目内容
       3.提交代码，使用判题功能(1.每道题的测试用例 2.compile_and_run)
    */
    svr.Get("/all_questions",[&ctrl](const Request& req,Response& resp)
    {
        //需要返回一张包含所有题目的html网页
        std::string html;
        ctrl.AllQuestions(&html);
        resp.set_content(html,"text/html;charset=utf-8");
    });

    //选题：正则表达式 如用户请求 /questions/100  \d代表匹配数字,+代表一或多个，所以可以匹配到用户输入的任意数字
    //R"()" 原始字符串，里面是什么样就是什么样，保持字符串内容的原貌，无需做相关强转
    svr.Get(R"(/question/(\d+))",[&ctrl](const Request& req,Response& resp)
    {
        //req.matches[1]代表了正则匹配到的题号
        std::string number = req.matches[1];
        std::string html;
        ctrl.Question(number,&html);

        resp.set_content(html,"text/html;charset=utf-8");

    });

    svr.Post(R"(/judge/(\d+))",[&ctrl](const Request& req,Response& resp)
    {
        //req.matches[1]代表了正则匹配到的题号
        std::string number = req.matches[1];
        std::string result_json;
        ctrl.Judge(number,req.body,&result_json);
        resp.set_content(result_json,"application/json;charset=utf-8");
        //resp.set_content("这是指定的题目的判题:"+number,"text/plain;charset=utf-8");
    });

    //首页设置为本目录下的wwwroot
    svr.set_base_dir("./wwwroot");

    svr.listen("0.0.0.0",8081);
    return 0;
}